<?php
declare(strict_types=1);

namespace LowCode\Traits\Vue;

trait HasLifeCycle
{
    /**
     * @param string $setup
     * @return $this
     */
    public function setup(string $setup): static
    {
        $this->setup = $setup;
        return $this;
    }

    /**
     * @param string $name
     * @param string $callback
     * @return $this
     */
    protected function lifeCycle(string $name, string $callback): static
    {
        if (!str_starts_with($callback,"()=>{")&&!str_starts_with($callback,"function(){")){
            $callback = "()=>{{$callback}}";
        }
        $this->builder->lifeCycle->add([
            "name"=>$name,
            "callback"=>"$name($callback)"
        ]);
        return $this;
    }

    /**
     * 注册一个钩子，在组件被挂载之前被调用。
     * @param string $callback
     * @return $this
     */
    public function onBeforeMount(string $callback): static
    {
        return $this->lifeCycle("onBeforeMount", $callback);
    }

    /**
     * 注册一个钩子，在组件即将因为响应式状态变更而更新其 DOM 树之前调用。
     * @param string $callback
     * @return $this
     */
    public function onBeforeUpdate(string $callback): static
    {
        return $this->lifeCycle("onBeforeUpdate", $callback);
    }

    /**
     * 注册一个钩子，在组件实例被卸载之前调用。
     * @param string $callback
     * @return $this
     */
    public function onBeforeUnmount(string $callback): static
    {
        return $this->lifeCycle("onBeforeUnmount", $callback);
    }

    /**
     * 注册一个回调函数，在组件挂载完成后执行。
     * @param string $callback
     * @return $this
     */
    public function onMounted(string $callback): static
    {
        return $this->lifeCycle("onMounted", $callback);
    }

    /**
     * 注册一个回调函数，在组件因为响应式状态变更而更新其 DOM 树之后调用。
     * @param string $callback
     * @return $this
     */
    public function onUpdated(string $callback): static
    {
        return $this->lifeCycle("onUpdated", $callback);
    }

    /**
     * 注册一个钩子，在捕获了后代组件传递的错误时调用。
     * @param string $callback
     * @return $this
     */
    public function onErrorCaptured(string $callback): static
    {
        return $this->lifeCycle("onErrorCaptured", $callback);
    }

    /**
     * 注册一个回调函数，若组件实例是 <KeepAlive> 缓存树的一部分，当组件被插入到 DOM 中时调用。
     * @param string $callback
     * @return $this
     */
    public function onActivated(string $callback): static
    {
        return $this->lifeCycle("onActivated", $callback);
    }

    /**
     * 注册一个回调函数，若组件实例是 <KeepAlive> 缓存树的一部分，当组件从 DOM 中被移除时调用。
     * @param string $callback
     * @return $this
     */
    public function onDeactivated(string $callback): static
    {
        return $this->lifeCycle("onDeactivated", $callback);
    }

    /**
     * @return string
     */
    protected function getLifeCycleHtml(): string
    {
        $this->builder->lifeCycle->pluck("name")->each(function ($name){
            $this->builder->import->add($name);
        });
        $values = $this->builder->lifeCycle->pluck("callback")->all();
        return $this->implode($values);
    }
}
